Skip to content

fix(service): 补齐 compact keepalive writer nil 守卫#4019

Open
wucm667 wants to merge 1 commit into
Wei-Shaw:mainfrom
wucm667:fix/compact-keepalive-writer-nil-guard
Open

fix(service): 补齐 compact keepalive writer nil 守卫#4019
wucm667 wants to merge 1 commit into
Wei-Shaw:mainfrom
wucm667:fix/compact-keepalive-writer-nil-guard

Conversation

@wucm667

@wucm667 wucm667 commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

问题

生产真实流量下 /v1/responses(多为 stream)在请求结束后会反复出现 recovered panic:runtime error: invalid memory address or nil pointer dereference。关键路径是 Logger 中间件在请求结束后读取 c.Writer.Status() / Written(),委托链进入 openAICompactKeepaliveWriter 后访问已释放的内层 ResponseWriter,导致空指针 panic。

Fixes #4000

根因

openAICompactKeepaliveWriter 的读侧委托方法 Status / Size / Written 直接在锁内调用 w.ResponseWriter.Xxx(),没有处理请求结束后内层 writer 被释放为 nil 的场景;写侧委托方法也缺少相同的防御性 nil 守卫。

#3994 / bc3cb290 已经给兄弟包装器 opsCaptureWriter 补齐了委托方法 nil 守卫,但没有覆盖 service/openai_compact_sse_keepalive.go 这一层,因此 keepalive writer 仍会裸调用内层 writer。

改动

  • openAICompactKeepaliveWriterHeaderWriteWriteStringWriteHeaderWriteHeaderNowFlushStatusSizeWritten 补齐 nil 守卫。
  • 给通过嵌入 gin.ResponseWriter 暴露的 HijackCloseNotifyPusher 补齐与 fix(handler): opsCaptureWriter 释放后 nil pointer panic #3994 一致的防御性实现。
  • suspend() 增加 w.k == nil 守卫,避免防御场景下停拍时空指针。
  • 新增单测覆盖:内层 writer 为 nil、keepalive 指针为 nil、正常非 nil 委托路径不回归。

验证

cd backend && go build ./...
cd backend && go test -tags=unit ./internal/service/...
cd backend && golangci-lint run ./...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

反馈一个 Sub2API v0.1.151 运行态有 recovered panic

1 participant